home *** CD-ROM | disk | FTP | other *** search
- unit Progresu;
-
- interface
-
- uses
- ThunkU, SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
- Forms, Dialogs, StdCtrls, Grids, DBGrids, DB, DBTables, DbiTypes,
- DbiProcs;
-
- const
- wm_GenProgress = wm_User + 58;
-
- type
- TForm1 = class(TForm)
- Table1: TTable;
- DataSource1: TDataSource;
- DBGrid1: TDBGrid;
- FillBtn: TButton;
- CopyBtn: TButton;
- Table2: TTable;
- DBGrid2: TDBGrid;
- DataSource2: TDataSource;
- EmptyBtn: TButton;
- QueryBtn: TButton;
- Query1: TQuery;
- procedure FormDestroy(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure EmptyBtnClick(Sender: TObject);
- procedure FillBtnClick(Sender: TObject);
- procedure CopyBtnClick(Sender: TObject);
- procedure QueryBtnClick(Sender: TObject);
- private
- { Private declarations }
- FOldCallBack: TCallBack;
- FProgressBuf: CBProgressDesc;
- FProgressFunctionThunk: TFarProc;
- public
- { Public declarations }
- procedure WMGenProgress(var Msg: TMessage); message wm_GenProgress;
- end;
-
- var
- Form1: TForm1;
-
- implementation
-
- {$R *.DFM}
- {$S-}
-
- function ProgressFunction(ecbType: CBType; iClientData: Longint;
- var CbInfo: Pointer): CBRType; export;
- begin
- Result := cbrUseDef;
- if ecbType = cbGenProgress then
- Result := CBRType(SendMessage(Application.MainForm.Handle,
- wm_GenProgress, 0, Longint(@Form1.FProgressBuf)));
- with Form1.FOldCallBack do
- if ChainedFunc <> nil then Result :=
- pfDBICallBack(ChainedFunc)(cbGenProgress, Data, Buffer)
- end;
-
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- try
- Table1.Exclusive := True;
- Table1.Open;
- Table2.Exclusive := True;
- Table2.Open;
- except
- on EDatabaseError do
- MessageDlg('Can''t find those tables', mtError, [mbOk], 0);
- end;
- FProgressFunctionThunk := NewMakeProcInstance(@ProgressFunction, HInstance);
- with FOldCallBack do
- DbiGetCallBack(nil, cbGenProgress, Data, BufLen, Buffer, @ChainedFunc);
- DbiRegisterCallBack(nil, cbGenProgress, 0, SizeOf(FProgressBuf),
- @FProgressBuf, pfDbiCallBack(FProgressFunctionThunk));
- end;
-
- procedure TForm1.FormDestroy(Sender: TObject);
- begin
- DbiRegisterCallBack(nil, cbGenProgress, 0, 0, nil, nil);
- NewFreeProcInstance(FProgressFunctionThunk);
- end;
-
- procedure TForm1.WMGenProgress(var Msg: TMessage);
- var
- Progress: String;
- begin
- with pCBProgressDesc(Msg.LParam)^ do
- if iPercentDone <> -1 then
- Progress := IntToStr(iPercentDone)
- else
- Progress := StrPas(szMsg);
- {$define INTERACTIVE}
- {$ifdef INTERACTIVE}
- case MessageDlg(Progress + '. Continue?', mtConfirmation, [mbYes, mbNo], 0) of
- mrYes: Msg.Result := Longint(cbrContinue);
- mrNo: Msg.Result := Longint(cbrAbort);
- end;
- {$else}
- Caption := Progress;
- {$endif}
- end;
-
- procedure TForm1.EmptyBtnClick(Sender: TObject);
- begin
- Table1.EmptyTable;
- Table2.EmptyTable;
- end;
-
- procedure TForm1.FillBtnClick(Sender: TObject);
- var
- Loop: Longint;
- const
- NumRecs = 5000;
- begin
- Screen.Cursor := crSQLWait;
- with Table1 do
- begin
- DisableControls;
- for Loop := RecordCount + 1 to RecordCount + NumRecs do
- begin
- Append;
- Fields[0].AsInteger := Random(High(SmallInt));
- Fields[1].AsInteger := Random(High(SmallInt));
- Post;
- Caption := 'Adding record ' + IntToStr(Loop) + ' of ' + IntToStr(NumRecs);
- end;
- First;
- EnableControls;
- end;
- Screen.Cursor := crDefault;
- Caption := 'Copy the table to see the callback';
- end;
-
- procedure TForm1.CopyBtnClick(Sender: TObject);
- begin
- Table2.BatchMove(Table1, batAppend);
- Table1.First;
- end;
-
- procedure TForm1.QueryBtnClick(Sender: TObject);
- begin
- Query1.Close;
- Query1.Open;
- end;
-
- end.
-